package org.pcorp.battlespace.construction.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jfree.chart.ChartPanel;
import org.pcorp.battlespace.construction.modele.PuissanceArc;
import org.pcorp.battlespace.construction.service.graph.GraphPuissance;
import org.pcorp.battlespace.modele.Equipement;
import org.pcorp.battlespace.modele.Vaisseau;
import org.pcorp.battlespace.modele.equipement.Armement;
import org.pcorp.battlespace.modele.equipement.Sabord;
import org.pcorp.battlespace.utils.CodeCnt;

public class StatistiqueBatiment {
	public static Map<Integer, PuissanceArc> calculPuissances(Vaisseau vaiss) {
		List<Sabord> sabords = vaiss.getSabords();
		Map<Integer, PuissanceArc> puissances = new HashMap<Integer, PuissanceArc>();

		for (Sabord sabord : sabords) {
			Integer id = new Integer(CodeCnt.getSabord(sabord.getNom()));
			puissances.put(id, calculPuissance(sabord));
		}

		return puissances;
	}

	public static PuissanceArc calculPuissance(Sabord sab) {
		List<Equipement> armements = sab.getArmements();
		PuissanceArc puissanceArc = new PuissanceArc();

		long puissanceC = 0;
		long puissanceM = 0;
		long puissanceL = 0;
		long puissanceE = 0;
		long puissanceCHp = 0;
		long puissanceMHp = 0;
		long puissanceLHp = 0;
		long puissanceEHp = 0;

		for (Equipement equipement : armements) {
			Armement arme = (Armement)equipement;
			switch ((int)arme.getPortee()) {
				case CodeCnt.PORTE_E:
					puissanceE += arme.getDegatX()*arme.getDegatY();
					if (arme.getSsType().equalsIgnoreCase(CodeCnt.COD_TYP_NRJ)) {
						puissanceEHp += arme.getDegatX()*arme.getDegatY();
					}
					break;
				case CodeCnt.PORTE_L:
					puissanceL += arme.getDegatX()*arme.getDegatY();
					if (arme.getSsType().equalsIgnoreCase(CodeCnt.COD_TYP_NRJ)) {
						puissanceLHp += arme.getDegatX()*arme.getDegatY();
					}
					break;
				case CodeCnt.PORTE_M:
					puissanceM += arme.getDegatX()*arme.getDegatY();
					if (arme.getSsType().equalsIgnoreCase(CodeCnt.COD_TYP_NRJ)) {
						puissanceMHp += arme.getDegatX()*arme.getDegatY();
					}
					break;
				case CodeCnt.PORTE_C:
					puissanceC += arme.getDegatX()*arme.getDegatY();
					if (arme.getSsType().equalsIgnoreCase(CodeCnt.COD_TYP_NRJ)) {
						puissanceCHp += arme.getDegatX()*arme.getDegatY();
					}
					break;
				default:
					break;
			}
		}
		
		puissanceL += puissanceE;
		puissanceM += puissanceL;
		puissanceC += puissanceM;
		
		puissanceLHp += puissanceEHp;
		puissanceMHp += puissanceLHp;
		puissanceCHp += puissanceMHp;
		
		puissanceArc.setPuissanceE(puissanceE);
		puissanceArc.setPuissanceL(puissanceL);
		puissanceArc.setPuissanceM(puissanceM);
		puissanceArc.setPuissanceC(puissanceC);
		
		puissanceArc.setPuissanceEHp(puissanceEHp);
		puissanceArc.setPuissanceLHp(puissanceLHp);
		puissanceArc.setPuissanceMHp(puissanceMHp);
		puissanceArc.setPuissanceCHp(puissanceCHp);
		
		puissanceArc.setPuissance(getPuissance(puissanceArc));
		puissanceArc.setPuissanceHp(getPuissanceHp(puissanceArc));
		
		puissanceArc.setPortee(getPortee(puissanceArc));
		puissanceArc.setPorteeHp(getPortee(puissanceArc));
		puissanceArc.setPorteeUtile(getPortee(puissanceArc));
		
		return puissanceArc;

	}


	public static long getPorteeUtile(PuissanceArc puissanceArc) {
		long pUtile = Math.round(getPuissance(puissanceArc)*0.7d);
		long portee = CodeCnt.PORTE_C;

		if (pUtile<puissanceArc.getPuissanceM()) {
			portee = CodeCnt.PORTE_M;
		}

		if (pUtile<puissanceArc.getPuissanceL()) {
			portee = CodeCnt.PORTE_L;
		}

		if (pUtile<puissanceArc.getPuissanceE()) {
			portee = CodeCnt.PORTE_E;
		}

		return portee;
	}

	public static long getPuissance(PuissanceArc puissanceArc) {
		long puissance = puissanceArc.getPuissanceC();

		if (puissance<puissanceArc.getPuissanceM()) {
			puissance = puissanceArc.getPuissanceM();
		}

		if (puissance<puissanceArc.getPuissanceL()) {
			puissance = puissanceArc.getPuissanceL();
		}

		if (puissance<puissanceArc.getPuissanceE()) {
			puissance = puissanceArc.getPuissanceE();
		}

		return puissance;
	}

	public static long getPuissanceHp(PuissanceArc puissanceArc) {
		long puissance = puissanceArc.getPuissanceCHp();

		if (puissance<puissanceArc.getPuissanceMHp()) {
			puissance = puissanceArc.getPuissanceMHp();
		}

		if (puissance<puissanceArc.getPuissanceLHp()) {
			puissance = puissanceArc.getPuissanceLHp();
		}

		if (puissance<puissanceArc.getPuissanceEHp()) {
			puissance = puissanceArc.getPuissanceEHp();
		}

		return puissance;
	}

	public static long getPorteeHp(PuissanceArc puissanceArc) {
		long puissance = getPuissanceHp(puissanceArc);

		if (puissance == puissanceArc.getPuissanceEHp()) {
			return CodeCnt.PORTE_E;
		}

		if (puissance == puissanceArc.getPuissanceLHp()) {
			return CodeCnt.PORTE_L;
		}

		if (puissance == puissanceArc.getPuissanceMHp()) {
			return CodeCnt.PORTE_M;
		}

		return CodeCnt.PORTE_C;
	}

	public static long getPortee(PuissanceArc puissanceArc) {
		long puissance = getPuissance(puissanceArc);

		if (puissance == puissanceArc.getPuissanceE()) {
			return CodeCnt.PORTE_E;
		}

		if (puissance == puissanceArc.getPuissanceL()) {
			return CodeCnt.PORTE_L;
		}

		if (puissance == puissanceArc.getPuissanceM()) {
			return CodeCnt.PORTE_M;
		}

		return CodeCnt.PORTE_C;
	}

	public static ChartPanel getPuissanceGraph(Map<Integer, PuissanceArc> puissances) {
		ChartPanel chart = new ChartPanel(GraphPuissance.getGraphStat(puissances));
		return chart;
	}
}

